package com.demo.facade09;

//Facade类
/**
 * 我们以一个计算机的启动过程为例：
 *  外观模式通过对客户端提供一个统一的接口，用于访问子系统中的一群接口。使用外观模式有以下几点好处：
 *
 * （1）更加易用：使得子系统更加易用，客户端不再需要了解子系统内部的实现，也不需要跟众多子系统内部的模块进行交互，
 * 只需要跟外观类交互就可以了；
 *
 * （2）松散耦合：将客户端与子系统解耦，让子系统内部的模块能更容易扩展和维护。
 *
 * （3）更好的划分访问层次：通过合理使用 Facade，可以更好地划分访问的层次，有些方法是对系统外的，有些方法是系统
 * 内部使用的。把需要暴露给外部的功能集中到门面中，这样既方便客户端使用，也很好地隐藏了内部的细节。
 *
 *   但是如果外观模式对子系统类做太多的限制则减少了可变性和灵活性，所以外观模式适用于为复杂子系统提供一个简单接口，
 *   提高系统的易用性场景 以及 引入外观模式将子系统与客户端进行解耦，提高子系统的独立性和可移植性。
 *
 *   Facade 门面角色：客户端可以调用这个角色的方法，该角色知晓相关子系统的功能。在正常情况下，本角色会将所有从
 *   客户端发来的请求委派到相应的子系统去。
 *   SubSystem 子系统角色：可以同时有一个或者多个子系统。每个子系统都不是一个单独的类，而是一个类的集合（如上面的
 *   子系统就是由 SubSystemA、SubSystemB、SubSystemC、SubSystemD 几个类组合而成）。每个子系统都可以被客户
 *   端直接调用，或者被门面角色调用。子系统并不知道门面的存在，对于子系统而言，门面角色仅仅是另外一个客户端而已。
 *
 *   1、一个系统可以有几个外观类？
 *      在外观模式中，通常只需要一个外观类，并且此外观类只有一个实例，也就是单例类。但这并不意味着在整个系统里只有一个外观类，
 *      而仅仅是说对每一个子系统只有一个外观类。或者说，如果一个系统有好几个子系统的话，每一个子系统都有一个外观类，整个系统可以有数个外观类。
 *
 *   2、能否为子系统增加新行为？
 *         外观模式的用意是为子系统提供一个集中化和简化的沟通管道，而不能向子系统加入新的行为。比如医院中的接待员
 *         并不是医护人员，接待员并不能为病人提供医疗服务。
 */
public class Computer {
	private final CPU cpu;
	private final Memory memory;
	private final Disk disk;
	
	public Computer(){
		cpu = new CPU();
		memory = new Memory();
		disk = new Disk();
	}
	
	public void startup(){
		System.out.println("start the computer!");
		cpu.startup();
		memory.startup();
		disk.startup();
		System.out.println("start computer finished!");
	}
	
	public void shutdown(){
		System.out.println("begin to close the computer!");
		cpu.shutdown();
		memory.shutdown();
		disk.shutdown();
		System.out.println("computer closed!");
	}
}